﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Messaging;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using Eventos;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

namespace ServidorActividad
{
    class Program
    {
        static void Main(string[] args)
        {
            MessageQueue mq;
            string rutaColaClientes = ConfigurationManager.AppSettings["RUTA_COLA_CLIENTES"];

            //pregunto si existe una cola de mensajes en la maquina
            if (MessageQueue.Exists(@".\private$\" + rutaColaClientes))
            {
                //me genera una referencia a la cola de mensaje que existe
                mq = new MessageQueue(@".\private$\" + rutaColaClientes);
            }
            else
            {
                //si no existe, la creo y me devuelve la referencia a la cola creada
                mq = MessageQueue.Create(@".\private$\" + rutaColaClientes);
            }

            mq.Formatter = new XmlMessageFormatter(new Type[] { typeof(Evento) });

            Console.WriteLine("[ACTIVIDAD] Se inicio QUEUE de Actividad.");

            Container contenedor = Container.GetInstancia();

            //Inicio el hilo de RPC para el servidor de conciliacion
            String PUERTO_RPC = ConfigurationManager.AppSettings["PUERTO_RPC"];
            Thread hiloRPC = new Thread(() => IniciarRPC(PUERTO_RPC));
            hiloRPC.Start();

            while (true)
            {

                Message msg = mq.Receive();

                //Console.WriteLine((Evento)msg.Body);

                Evento evnt = (Evento)msg.Body;

                Console.WriteLine("[ACTIVIDAD] Accion: " + evnt.Comando.ToString() + ", IdSesion: " + evnt.IdSesion.ToString() + ", Texto: " + evnt.Texto);

                contenedor.AgregarEvento(evnt);

                mq.Purge();//En cada llamada limpio la QUEUE
                Thread.Sleep(500);
            }

        }

        public static void IniciarRPC(String PUERTO_RPC){
            try
            {
                int PUERTO = 0;
                int.TryParse(PUERTO_RPC, out PUERTO);
            
                TcpChannel channel = new TcpChannel(PUERTO);
                ChannelServices.RegisterChannel(channel, false);
                RemotingConfiguration.ApplicationName = "ActividadRPC";
                RemotingConfiguration.RegisterActivatedServiceType(typeof(Evento));
                RemotingConfiguration.RegisterActivatedServiceType(typeof(ActividadRPCImp));
                Console.WriteLine("[ACTIVIDADRPC] Se inicio RPC de Actividad.");
                Thread.Sleep(new TimeSpan(23, 59, 59));
                ChannelServices.UnregisterChannel(channel);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("[ACTIVIDADRPC]: Problemas al iniciar el hilo de ejecucion del servicio Remoting.");
                    Console.Write(ex.Message);
                    
                }
        }
    }
}
